﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Dao;
using Dao.Intermediarios;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class ABMProducto : Form
    {
        #region Property

        int idP;
        string[] elementos;
        Producto producto;
        Producto _prodUltimo;
        IList<Producto> listProducto;
        private IPProducto ipProducto = new IPProducto();
        private IPPersona ipPersona = new IPPersona();
        private IPProveedor ipProveedor = new IPProveedor();
        private IPMedida ipMedida = new IPMedida();
        private const string doublePattern = "[0-9]+(,)[0-9]+";

        #endregion Property

        #region Events

        public ABMProducto(int id)
        {
            InitializeComponent();
            cbTipoPolitica.SelectedIndex = 0;
            LoadCombos();
            BuscarProductos();
            idP = id;

            if (idP != 0)
                LoadControls();
        }

        private void buttonGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                string valid = ValidarCampos();

                if (string.IsNullOrEmpty(valid))
                {
                    if (idP == 0)
                        producto = new Producto();

                    producto.NombreProducto = txtDescripcion.Text.Trim();
                    producto.Proveedor = (Proveedor)cbProveedores.SelectedItem;

                    producto.Almacen = txtAlmacen.Text.Trim();
                    producto.CategoriaArticulo = txtCateg.Text.Trim();
                    producto.ClaseArticulo = txtClaseArt.Text.Trim();
                    producto.CodigoAnalisisVenta = txtCodAnalisisVta.Text.Trim();
                    producto.CodigoBonificacion = txtCodBonifDcto.Text.Trim();
                    producto.CodigoImpuesto = txtCodImpuestos.Text.Trim();
                    //producto.codProducto
                    producto.CostoAlmacenamiento = (!string.IsNullOrEmpty(txtCtoAlmac.Text) ? double.Parse(txtCtoAlmac.Text.Trim()) : 0);
                    producto.CostoEmision = (!string.IsNullOrEmpty(txtCtoEmision.Text) ? double.Parse(txtCtoEmision.Text.Trim()) : 0);
                    producto.CostoEstandard = (!string.IsNullOrEmpty(txtCtoEstandar.Text) ? double.Parse(txtCtoEstandar.Text.Trim()) : 0);
                    producto.CostoUnitario = (!string.IsNullOrEmpty(txtCtoUnit.Text) ? double.Parse(txtCtoUnit.Text.Trim()) : 0);
                    producto.Estanteria = txtEstanteria.Text.Trim();

                    producto.Medida = (Medida)cbUnidadMedida.SelectedItem;
                    producto.Persona = (Persona)cbPlanifi.SelectedItem;

                    producto.NumeroDepartamento = txtNumdpto.Text.Trim();
                    producto.NumPlano = txtNumPlano.Text.Trim();
                    producto.PorcentPrecioUnitario = (!string.IsNullOrEmpty(txtPorcPrecioUnit.Text) ? double.Parse(txtPorcPrecioUnit.Text.Trim()) : 0);
                    producto.PrecioBase = (!string.IsNullOrEmpty(txtPrecioBase.Text) ? double.Parse(txtPrecioBase.Text.Trim()) : 0);
                    producto.PesoUnidad = (!string.IsNullOrEmpty(txtPesoUnidad.Text) ? double.Parse(txtPesoUnidad.Text.Trim()) : 0);
                    producto.TamañoLoteStandard = (!string.IsNullOrEmpty(txtTamLoteStandar.Text) ? double.Parse(txtTamLoteStandar.Text.Trim()) : 0);
                    producto.codProducto = txtCodigo.Text;

                    producto.TipoPolitica = cbTipoPolitica.SelectedItem.ToString();

                    producto.c1 = "04";
                    producto.c2 = elementos[1];
                    producto.c3 = elementos[2];
                    producto.c4 = elementos[3];

                    if (idP == 0)
                        ipProducto.save<Producto>(producto);

                    Intermediario.confirmarCambios();

                    MessageBox.Show("Producto guardado correctamente");
                    this.Close();
                }
                else
                    MessageBox.Show(valid);
            }
            catch (Exception)
            {
                MessageBox.Show("Ocurrió un error al guardar el producto");
            }
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #endregion Events

        #region Methods

        private void LoadCombos()
        {
            cbPlanifi.DataSource = ipPersona.getAll<Persona>();
            cbProveedores.DataSource = ipProveedor.getAll<Proveedor>();
            cbUnidadMedida.DataSource = ipMedida.getAll<Medida>();
        }

        private void BuscarProductos()
        {
            _prodUltimo = ipProducto.getAll<Producto>().Last();

            if (Convert.ToInt16(_prodUltimo.c4) < 99)
            {
                txtCodigo.Text = _prodUltimo.c1.Trim() + "." + _prodUltimo.c2.Trim() + "." + _prodUltimo.c3.Trim() + "." + (((Convert.ToInt16(_prodUltimo.c4)) + 1) < 9 ? ("0" + (Convert.ToInt16(_prodUltimo.c4) + 1)).ToString() : (Convert.ToInt16(_prodUltimo.c4) + 1).ToString());
            }
            else if (Convert.ToInt16(_prodUltimo.c3) < 99)
            {
                txtCodigo.Text = _prodUltimo.c1.Trim() + "." + _prodUltimo.c2.Trim() + "." + (((Convert.ToInt16(_prodUltimo.c3)) + 1) < 9 ? ("0" + (Convert.ToInt16(_prodUltimo.c3) + 1)).ToString() : (Convert.ToInt16(_prodUltimo.c3) + 1).ToString()) + "." + _prodUltimo.c4.Trim();
            }
            else
            {
                txtCodigo.Text = _prodUltimo.c1.Trim() + "." + (((Convert.ToInt16(_prodUltimo.c2)) + 1) < 9 ? ("0" + (Convert.ToInt16(_prodUltimo.c2) + 1)).ToString() : (Convert.ToInt16(_prodUltimo.c2) + 1).ToString()) + "." + _prodUltimo.c3.Trim() + "." + _prodUltimo.c4.Trim();
            }

            char[] separador = new char[] { '.' };
            elementos = txtCodigo.Text.Split(separador);
        }

        private void LoadControls()
        {
            producto = (Producto)ipProducto.getPorId(idP);

            txtDescripcion.Text = producto.NombreProducto;
            cbProveedores.SelectedValue = producto.IdProveedor;

            txtAlmacen.Text = producto.Almacen;
            txtCateg.Text = producto.CategoriaArticulo;
            txtClaseArt.Text = producto.ClaseArticulo;
            txtCodAnalisisVta.Text = producto.CodigoAnalisisVenta;
            txtCodBonifDcto.Text = producto.CodigoBonificacion;
            txtCodImpuestos.Text = producto.CodigoImpuesto;

            txtCodigo.Text = producto.codProducto;

            txtCtoAlmac.Text = producto.CostoAlmacenamiento.Value.ToString();
            txtCtoEmision.Text = producto.CostoEmision.Value.ToString();
            txtCtoEstandar.Text = producto.CostoEstandard.Value.ToString();
            txtCtoUnit.Text = producto.CostoUnitario.Value.ToString();
            txtEstanteria.Text = producto.Estanteria;

            cbUnidadMedida.SelectedValue = producto.IdMedida;
            cbPlanifi.SelectedValue = producto.IdPlanificador;

            txtNumdpto.Text = producto.NumeroDepartamento;
            txtNumPlano.Text = producto.NumPlano;
            txtPorcPrecioUnit.Text = producto.PorcentPrecioUnitario.Value.ToString();
            txtPrecioBase.Text = producto.PrecioBase.Value.ToString();
            txtPesoUnidad.Text = producto.PesoUnidad.Value.ToString();
            txtTamLoteStandar.Text = producto.TamañoLoteStandard.Value.ToString();

            cbTipoPolitica.SelectedItem = producto.TipoPolitica;

        }

        private string ValidarCampos()
        {
            // campos string
            if (string.IsNullOrEmpty(txtDescripcion.Text))
                return "Debe ingresar una descripción";

            // campos numéricos

            //if (!string.IsNullOrEmpty(txtCtoAlmac.Text) && !Regex.IsMatch(txtCtoAlmac.Text.Trim(), doublePattern))
            //    return "El costo de almacenamiento debe ser un número decimal";

            //if (!string.IsNullOrEmpty(txtCtoEmision.Text) && !Regex.IsMatch(txtCtoEmision.Text.Trim(), doublePattern))
            //    return "El costo de emisión debe ser un número decimal";

            //if (!string.IsNullOrEmpty(txtCtoEstandar.Text) && !Regex.IsMatch(txtCtoEstandar.Text.Trim(), doublePattern))
            //    return "El costo de estándar debe ser un número decimal";

            //if (!string.IsNullOrEmpty(txtCtoUnit.Text) && !Regex.IsMatch(txtCtoUnit.Text.Trim(), doublePattern))
            //    return "El costo de unitario debe ser un número decimal";

            //if (!string.IsNullOrEmpty(txtPorcPrecioUnit.Text) && !Regex.IsMatch(txtPorcPrecioUnit.Text.Trim(), doublePattern))
            //    return "El porcentaje del precio unitario debe ser un número decimal";

            //if (!string.IsNullOrEmpty(txtPrecioBase.Text) && !Regex.IsMatch(txtPrecioBase.Text.Trim(), doublePattern))
            //    return "El precio base debe ser un número decimal";

            //if (!string.IsNullOrEmpty(txtPesoUnidad.Text) && !Regex.IsMatch(txtPesoUnidad.Text.Trim(), doublePattern))
            //    return "El peso por unidad debe ser un número decimal";

            //if (!string.IsNullOrEmpty(txtTamLoteStandar.Text) && !Regex.IsMatch(txtTamLoteStandar.Text.Trim(), doublePattern))
            //    return "El tamaño del lote estándar debe ser un número decimal";

            return "";
        }

        //private void 

        #endregion Methods
    }
}
